import type { CreateAxiosDefaults, InternalAxiosRequestConfig, AxiosRequestConfig, AxiosResponse, AxiosError } from "axios"
import type { RequestConfigExtra } from "../types"
import { ResponseData } from "@/hooks/useAxios"

/**
 * 创建Axios使用
 */
export interface CustomCreateAxiosDefaults extends CreateAxiosDefaults {
    transform?: AxiosTransform
    requestOptions?: RequestConfigExtra
}

/**
 * 发起请求时，需要将配置附加到请求对象 InternalAxiosRequestConfig 中
 */
export interface CustomAxiosRequestConfig {
    requestOptions?: RequestConfigExtra
}

/**
 * 数据处理类，可以根据项目自行配置
 */
export abstract class AxiosTransform {
    /**
     * @description: 对 options 配置进行处理
     */
    beforeRequestHook?: (config: AxiosRequestConfig, options: RequestConfigExtra) => void

    /**
     * @description: 请求之前的拦截器，附加 token 到 header 头
     */
    requestInterceptors?: (config: InternalAxiosRequestConfig, options: RequestConfigExtra) => void

    /**
     * @description: 请求之前的拦截器错误处理
     */
    requestInterceptorsCatch?: (error: Error) => void

    /**
     * @description: 返回成功，对返回数据进行自定义处理
     */
    transformResponseData?: (res: AxiosResponse<ResponseData>, options: RequestConfigExtra) => any

    /**
     * @description: 请求失败处理
     */
    requestCatch?: (e: Error) => Promise<any>

    /**
     * @description: 请求之后的拦截器
     */
    responseInterceptors?: (res: AxiosResponse<any>) => AxiosResponse<any>

    /**
     * @description: 请求之后的拦截器错误处理
     */
    responseInterceptorsCatch?: (error: AxiosError) => void
}
